function ajax(option) {
  let defauldOption = {
      type: 'get',
      async: true,
      data: ''
  }
  // 把默认值 和 传递的值进行合并
  // 如果默认值中的一些属性 有同感参数传递使用 就是传递过来值
  let params = Object.assign(defauldOption, option);

  // 对必填的参数做一个判断
  if (!params.url) {
      // 手动抛出错误
      // 执行这句代码之后  不会执行后面代码（return的作用）
      throw Error('url参数是必填')
  }
  if (Object.prototype.toString.call(params.url) != '[object String]') {
      throw Error('url参数的值 必须是string类型')
  }

  // 判断success 是必填参数
  if (!params.success) {
      throw Error('success 回调函数是必填参数');
  }
  if (Object.prototype.toString.call(params.success) != '[object Function]') {
      throw Error('success的值必须是一个函数')
  }

  // 判断type属性
  if (Object.prototype.toString.call(params.type) != '[object String]') {
      throw Error('type 属性的属性值必须是字符串')
  }
  if (!/(get|post)/gi.test(params.type)) {
      throw Error('type 属性只能为 get 或者 post')
  }

  // async 属性的判断 必须为布尔值
  if (Object.prototype.toString.call(params.async) != '[object Boolean]') {
      throw Error('async 属性的值必须为布尔值')
  }

  // 判断data 参数的类型
  let dataType = Object.prototype.toString.call(params.data)
  if (dataType != '[object String]' && dataType != '[object Object]') {
      throw Error('data 属性的值必须是string或者Object类型')
  }
  // 如果参数为对象的时候 需要把对象转换为字符串的形式
  // 传递给后端的参数 只能为字符串的形式传递
  if (dataType == '[object Object]') {
      let arr = []
      for (let key in params.data) {
          arr.push(key + '=' + params.data[key])
      }
      params.data = arr.join('&');
  }

  // ajax请求的步骤
  let xhr = new XMLHttpRequest();
  // 如果请求方式为get请求
  if (params.type == 'get') {
      // '{"category":"graphic_design"}' 转换为key=value 的形式
      // get  请求 参数直接拼接地址后面 ，参数的格式只能为key=value的形式
      // 所以当参数为json字符串的时候 需要把json数据转换为key=value的格式
      if (params.data.indexOf('{') != -1) {
          let data = JSON.parse(params.data);
          let arr = []
          for (let key in data) {
              arr.push(key + '=' + data[key])
          }
          params.data = arr.join('&');
      }
      let url = params.data ? params.url + '?' + params.data : params.url;
      xhr.open(params.type, url, params.async);
      xhr.send()
  } else {
      xhr.open(params.type, params.url, params.async);
      // 设置请求头
      //key=value: application/x-www-form-urlencoded
      //'{"key":"value"}' application/json
      let type = params.data.indexOf('=') != -1 ? 'application/x-www-form-urlencoded' : 'application/json';
      xhr.setRequestHeader('Content-Type', type)
      xhr.send(params.data)
  }

  // xhr.onreadystatechange  当ajax请求的状态改变的时候 救护执行一次这个事件
  // ajax状态码 xhr.readyState 取值为：0 1 2 3 4 
  // 同步请求执行这里代码 调用回调函数 把结果返回
  if (params.async == false) {
      params.success(JSON.parse(xhr.responseText))
      return
  }
  // 异步请求获取结果的代码
  xhr.onload = function () {
      // success 函数主要用于获取异步请求的结果
      params.success(JSON.parse(xhr.responseText))
  }
}


